package pers.ree.demo.designpattern.singleton;

/**
 * 单例：静态内部类模式
 * 懒加载原理：
 * 加载一个类时，其内部类不会同时被加载。
 * 一个类被加载，当且仅当其某个静态成员（静态域、构造器、静态方法等）被调用时发生，
 * 也就是说内部类：InnerClass只有我们调用getInstance()的时候才会被加载。
 *
 * 线程安全原理：
 * 静态内部类只能同时有一个线程去初始化它，其他的被阻塞，如果一个线程初始化了这个静态内部类，那么其他的就不会再去初始化了。
 */
public class StaticInnerSingleton {

    private StaticInnerSingleton() {

    }

    private static class InnerSingleton {
        // todo final是否要加？
        private static final StaticInnerSingleton instance = new StaticInnerSingleton();
    }

    public StaticInnerSingleton getInstance() {
        return InnerSingleton.instance;
    }
}
